

package aeropuerto;
import java.util.*;
import java.io.*;

/**
 *
 * @author Java I
 */
public class Aeropuerto {

    private Set<Vuelo> vuelos;
    private static Map<String,String> compañias=new HashMap<String,String>();
    private int capacidad;
    private int tamañoslot;

    public Aeropuerto(int capac,int tamslot){

        if(compañias.isEmpty()){
            copiarFichero("companias.txt");
        }
        vuelos=new HashSet<Vuelo>();
        capacidad=capac;
        tamañoslot=tamslot;
    }

    public Aeropuerto(int capac){

        if(compañias.isEmpty()){
            copiarFichero("companias.txt");
        }
        vuelos=new HashSet<Vuelo>();
        capacidad=capac;
        tamañoslot=2;
    }

    private void copiarFichero(String nombre){  //Metodo privado para el aeropuerto
        Scanner sc=new Scanner(nombre);
        while(sc.hasNextLine()){
            String linea=sc.nextLine();
            String[] array=linea.split(" ");  //El metodo split me devuelve un array de cadenas separadas x espacio
            String palabra="";
            if(array.length==1){   //Si tiene solo una palabra la compañia
                palabra=array[0].substring(0, 1).toUpperCase();  //La primera letra en mayuscula
            }else if(array.length>1){  //Si tiene mas palabras la compañia
                palabra=(array[0].substring(0, 0).toUpperCase()+
                        array[1].substring(0, 0).toUpperCase());  //Paso a mayuscula las palabras iniciales
            }
            if((!linea.equals(" "))&&(!compañias.containsValue(palabra))){    //Si hay compañias vacias o se repite la clave
                compañias.put(linea, palabra);
            }else{
                throw new IllegalArgumentException("ERROR: Error al copiar de fichero");
            }
        }
        sc.close();
    }

    public Vuelo generaVuelo(){
        Set<String> conjunto;
        conjunto=compañias.keySet();     //Copio las claves en un conjunto nuevo

        int i=1;
        int lon=conjunto.size();
        Iterator it=conjunto.iterator();
        int num=((int)(Math.random()*lon));   //Elijo una clave al azar
        while(i<num){
            it.next();
            i++;
        }
        String palabra=(String)it.next();
        String acro=compañias.get(palabra);    //Me devuelve el acronimo de la clave
        Vuelo v1=new Vuelo(acro);
        return v1;
    }

    public void simulacion(String salida,int intentos,int slots){

        BufferedWriter bf=null;
        try{
            FileWriter f=new FileWriter(salida);
            bf=new BufferedWriter(f);

            int i,j,k,max=0;
            for(i=1;i<=slots;i++){     //Para cada slot
                max=0;
                bf.write("slot "+i+":\n");
                bf.write("Aviones en el Aeropuerto: ");
                Iterator ite=vuelos.iterator();
                while(ite.hasNext()){
                    Vuelo v2=(Vuelo)ite.next();
                    bf.write(v2.toString()+"  ");              //Muestro todos los aviones del
                }
                bf.write("\n");
               // bf.write("Peticiones de Aterrizaje: \n");

                int num1=(int)(Math.random()*intentos); //Numero aleatorio de aviones k kieren aterrizar
                bf.write("Peticiones de Aterrizaje:"+num1+"\n");
                for(j=1;j<=num1;j++){
                    Vuelo v1=generaVuelo();
                    int tierra=vuelos.size();   //Miro si tengo sitio en el aeropuerto
                    if((tierra<capacidad)&&(max<tamañoslot)){   //Si tengo sitio y me kedan movimientos en el slot
                        v1.aterriza(i);  //Avion aterriza
                        max++;               //Se incrementa los intentos
                        vuelos.add(v1);     // Añado el avion al aeropuerto
                        bf.write(v1.toString()+" aterriza\n");
                     }else{
                      bf.write(v1+" Avion desviado a otro aeropuerto \n");
                    }
                }
               // bf.write("Despegues: \n");
                int num2=(int)(Math.random()*intentos); //Numero de aviones k  kieren despegar
                 bf.write("Despegues: "+num2+"\n");
                for(k=1;k<=num2;k++){
                    if((max<tamañoslot)&&(vuelos.size()>0)){                  //Si me kedan movvimientos en el slots
                        Iterator it=vuelos.iterator();
                        Vuelo v2=(Vuelo)it.next();       //Me da un vuelo de  mi conjunto de vuelos
                        v2.despega(i);               //Actualizo su slotdespegue

                        bf.write(v2+"despega \n");
                        vuelos.remove(v2);               //Lo elimino del conjunto
                        max++;

                    }
                }

            }
        }catch(IOException e){
            System.err.print(e.getMessage());

        }finally{
            try{
                bf.close();
            }catch(IOException e3){
                System.err.print(e3.getMessage());
            }
        }









    }



    









}
